<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h2>new 关键字的作用</h2>
    <p>在 JavaScript 中，使用 new 关键字调用函数后，意味着做了如下四件事情：</p>
    <ol>
      <li>创建一个新的对象，这个对象的类型是 object</li>
      <li>
        将函数内部的 this 修正到上面新建的对象上来，并将这个新的对象的 __proto__
        属性的属性值设置为当前构造函数（指 prototype.construtor
        所指向的构造函数）
      </li>
      <li>
        执行构造函数，当 this 关键字被提及的时候，添加或使用新创建的对象的属性
      </li>
      <li>返回新创建的对象（除非构造方法中返回的是 “无原型”）</li>
    </ol>
  </body>
</html>
<script>
  function myNew(fn, ...args) {
    // 以函数原型对象为原型，创建一个新对象
    let _this = Object.create(fn.prototype);

    // 执行函数时，将函数内部 this 修改指向为新创建对象
    let res = fn.apply(_this, args);

    // 返回新创建的对象作为实例使用
    return _this;
  }

  function People(username, age) {
    this.username = username;
    this.age = age;
  }

  let p = myNew(People, "XiaoMing", 18);
  console.log(p); // { username: "XiaoMing", age: 18 }
  console.log(p instanceof People); // true
</script>
